package top.byteio.common.core.crypto;

import java.nio.charset.StandardCharsets;

/**
 * Base64算法并不是加密算法，它的出现是为了解决ASCII码在传输过程中可能出现乱码的问题.
 * Base64是网络上最常见的用于传输8bit字节码的可读性编码算法之一。
 * 可读性编码算法不是为了保护数据的安全性，而是为了可读性。可读性编码不改变信息内容，只改变信息内容的表现形式。
 * Base64使用了64种字符：大写A到Z、小写a到z、数字0到9、“+”和“/”，故得此名。
 *
 * @author lerry
 * @since 2023/6/21 14:32
 */
public class Base64 implements ICrypt {


    private static final String CLEANER = "[^A-Za-z0-9+/=]";
    /**
     * 将字节数组进行Base64编码
     *
     * @param data 需要进行编码的字节数组
     * @return java.lang.String 返回Base64编码后的字符串
     * @author lerry
     * @since 2023/5/19 20:09
     */
    public static String encode(byte[] data) {
        return java.util.Base64.getEncoder().encodeToString(data);
    }

    /**
     * 将字符串进行Base64编码
     *
     * @param str 需要进行编码的字符串
     * @return java.lang.String 返回Base64编码后的字符串
     * @author lerry
     * @since 2023/5/19 20:10
     */
    public static String encode(String str) {
        return java.util.Base64.getEncoder().encodeToString(str.trim().getBytes(StandardCharsets.UTF_8));
    }


    /**
     * 将Base64编码的字符串进行解码并转为字符串
     *
     * @param str 需要进行解码的字符串
     * @return java.lang.String 返回Base64解码后的字符串
     * @author lerry
     * @since 2023/5/19 20:11
     */
    public static String decode(String str) {
        return new String(java.util.Base64.getDecoder()
                .decode(str.trim().replaceAll(CLEANER, "")));
    }

    /**
     * 将Base64编码的字符串进行解码并转为字符串
     *
     * @param code 需要进行解码的字符串
     * @return java.lang.String 返回Base64解码后的字符串
     * @author lerry
     * @since 2023/5/19 20:11
     */
    public static byte[] decodeToBytes(String code) {
        return java.util.Base64.getDecoder()
                .decode(code.trim().replaceAll(CLEANER, ""));
    }

}
